package com.engine.cn.base;

/**
 * 1个球从100米高度落下又弹起,每次落地后弹回原高度的一半。
 * 请编写一个程序，计算出第10次落地后弹起后共经过了多少距离？第10次落地弹起多高？
 */
public class Road {
    /**
     * 计算num次落地后弹起的高度：分析，第一次扔下
     *
     * @param n     次数
     * @param first 首次落下的高度
     * @return 总路径
     */
    public static double road(int n, int first) {
        double sum = first;
        for (int i = 1; i <= n; i++) {
            sum += path(i, first) * 2;
        }
        return sum;
    }

    /**
     * 计算第n次弹起的高度
     *
     * @param n     次数
     * @param first 首次落下的高度
     * @return 第n次弹起的高度
     */
    public static double path(int n, int first) {
        //1 << n; // 相当于2^n , 1.0 / (1 << n)相当于2的n次方分之一；注意，1 >> n 会得到0, 他会向下取整
        //如果计算指数函数，则用 Math.pow(m, n); 计算小数使用：1 / Math.pow(m, n); 或者直接传负数进去也行
        return 1.0 / (1 << n) * first;
    }

    public static void main(String[] args) {
        double road = road(10, 100);
        System.out.println("road==>" + road);
    }
}
